/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package table.fornecedor;


import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.MaskFormatter;
import model.FornecedorMODEL;
import model.LogradouroMODEL;
import table.Pair;
import table.TooltipCellRender;
import utilitarios.Data;
import utilitarios.Sexo;

/**
 *
 * @author Welisson
 */
public class FornecedorTable extends AbstractTableModel {

    private static final int COL_RAZAO = 0;
    private static final int COL_NOME = 1;
    private static final int COL_CNPJ = 2;
    private static final int COL_TEL = 3;
    private static final int COL_RAMAL = 4;
    private static final int COL_EMAIL = 5;
    private static final int COL_CEP = 6;
    private static final int COL_RUA = 7;
    private static final int COL_BAIRRO = 8;
    private static final int COL_CIDADE = 9;
    private static final int COL_UF = 10;
    private static final int COL_NUM = 11;
    private List<FornecedorMODEL> fornecedores;
    private List<LogradouroMODEL> log;
    private TooltipCellRender renderer = new TooltipCellRender();   

    public FornecedorTable(List<FornecedorMODEL> fornecedores, List<LogradouroMODEL> logradouro) {
        this.fornecedores = fornecedores;
        log = logradouro;
    }

    @Override
    public int getRowCount() {
        return fornecedores.size();
    }

    @Override
    public int getColumnCount() {
        return 12;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        FornecedorMODEL forn = fornecedores.get(rowIndex);
        
        if (columnIndex == COL_RAZAO) {
            return new Pair<String, String>(forn.getRazaoSocial(), forn.getRazaoSocial());  
        } else if (columnIndex == COL_NOME) {
            return new Pair<String, String>(forn.getNome(), forn.getNome());  
//            return forn.getNome();
        } else if (columnIndex == COL_CNPJ) {
            return new Pair<String, String>(forn.getCnpj(), forn.getCnpj());  
        }  else if (columnIndex == COL_TEL) {
            return new Pair<String, String>(forn.getTel(), forn.getTel());  
        } else if (columnIndex == COL_RAMAL) {
            return new Pair<String, String>(forn.getRamal(), forn.getRamal());  
        } else if (columnIndex == COL_EMAIL) {
            return new Pair<String, String>(forn.getEmail(), forn.getEmail());  
        } else if (columnIndex == COL_CEP) {
            return new Pair<String, String>(format("#####-###", forn.getLogradouro()), format("#####-###", forn.getLogradouro()));  
        } else if (columnIndex == COL_RUA) {
            return new Pair<String, String>(log.get(rowIndex).getEndereco(), log.get(rowIndex).getEndereco());
        } else if (columnIndex == COL_BAIRRO) {
            return new Pair<String, String>(log.get(rowIndex).getBairro(), log.get(rowIndex).getBairro());  
        } else if (columnIndex == COL_CIDADE) {
            return new Pair<String, String>(log.get(rowIndex).getCidade(), log.get(rowIndex).getCidade());  
        } else if (columnIndex == COL_UF) {
            return new Pair<String, String>(log.get(rowIndex).getUf(), log.get(rowIndex).getUf());  
        } else if (columnIndex == COL_NUM) {
            return new Pair<String, String>(forn.getNum(), forn.getNum());  
        }

        return null;
    }

    @Override
    public String getColumnName(int column) {
        String coluna = "";
        switch (column) {
            case COL_RAZAO:
                coluna = "Razão.";
                break;
            case COL_NOME:
                coluna = "Nome";
                break;
            case COL_CNPJ:
                coluna = "CNPJ";
                break;
            case COL_TEL:
                coluna = "Telefone";
                break;
            case COL_RAMAL:
                coluna = "Ramal";
                break;
            case COL_EMAIL:
                coluna = "Email";
                break;
            case COL_CEP:
                coluna = "Cep";
                break;
            case COL_RUA:
                coluna = "Rua";
                break;
            case COL_BAIRRO:
                coluna = "Bairro";
                break;
            case COL_CIDADE:
                coluna = "Cidade";
                break;
            case COL_UF:
                coluna = "UF";
                break;
            case COL_NUM:
                coluna = "Número";
                break;
            default:
                throw new IllegalArgumentException("Coluna Inválida");
        }
        return coluna;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == COL_RAZAO) {
            return int.class;
        } else if (columnIndex == COL_NOME) {
            return String.class;
        } else if (columnIndex == COL_CNPJ) {
            return String.class;
        } else if (columnIndex == COL_TEL) {
            return String.class;
        } else if (columnIndex == COL_RAMAL) {
            return Date.class;
        } else if (columnIndex == COL_EMAIL) {
            return String.class;
        } else if (columnIndex == COL_CEP) {
            return String.class;
        } else if (columnIndex == COL_RUA) {
            return String.class;
        } else if (columnIndex == COL_BAIRRO) {
            return String.class;
        } else if (columnIndex == COL_CIDADE) {
            return String.class;
        } else if (columnIndex == COL_UF) {
            return String.class;
        } else if (columnIndex == COL_NUM) {
            return int.class;
        }
        return null;
    }

    public FornecedorMODEL get(int row) {
        return fornecedores.get(row);
    }
    
    public Object get(int rowIndex, int columnIndex) {
        FornecedorMODEL forn = fornecedores.get(rowIndex);
        
        if (columnIndex == COL_RAZAO) {
            return forn.getRazaoSocial();
        } else if (columnIndex == COL_NOME) {
            return forn.getNome();  
//            return forn.getNome();
        } else if (columnIndex == COL_CNPJ) {
            return forn.getCnpj();  
        } else if (columnIndex == COL_TEL) {
            return forn.getTel();  
        } else if (columnIndex == COL_RAMAL) {
            return forn.getRamal();  
        }  else if (columnIndex == COL_EMAIL) {
            return forn.getEmail();
        } else if (columnIndex == COL_CEP) {
            return format("#####-###", forn.getLogradouro());  
        } else if (columnIndex == COL_RUA) {
            return log.get(rowIndex).getEndereco();
        } else if (columnIndex == COL_BAIRRO) {
            return log.get(rowIndex).getBairro();  
        } else if (columnIndex == COL_CIDADE) {
            return log.get(rowIndex).getCidade();  
        } else if (columnIndex == COL_UF) {
            return log.get(rowIndex).getUf();  
        } else if (columnIndex == COL_NUM) {
            return forn.getNum();  
        }

        return null;
    }

    // Adiciona o sócio especificado ao modelo
    public void addFornecedor(FornecedorMODEL fornecedor, LogradouroMODEL logradouro) {
        // Adiciona o registro.
        this.fornecedores.add(fornecedor);
        this.log.add(logradouro);
        // Pega a quantidade de registros e subtrai 1 para
        // achar o último índice. A subtração é necessária
        // porque os índices começam em zero.
        int ultimoIndice = getRowCount() - 1;

        // Notifica a mudança.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public void updateFornecedor(int indiceLinha, FornecedorMODEL fornecedor, LogradouroMODEL logradouro) {
        this.fornecedores.set(indiceLinha, fornecedor);
        this.log.set(indiceLinha, logradouro);
        fireTableRowsUpdated(indiceLinha, indiceLinha);
    }

    // Remove o sócio da linha especificada.
    public void removeFornecedor(int indiceLinha) {
        // Remove o registro.
        fornecedores.remove(indiceLinha);

        // Notifica a mudança.
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }
    
    
    private String format(String pattern, Object value) {
        MaskFormatter mask;
        try {
            mask = new MaskFormatter(pattern);
            mask.setValueContainsLiteralCharacters(false);
            return mask.valueToString(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    
    
}
